package com.example.common

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import androidx.databinding.ViewDataBinding
import androidx.recyclerview.widget.RecyclerView.Adapter
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.example.net.entity.MutilVideoEntity
/**
 * 通用适配器类，用于在RecyclerView中展示泛型数据D。
 * 该适配器使用了DataBinding来绑定视图和数据。
 *
 * @param layout 一个函数，用于返回每个数据项对应的布局资源ID和变量ID。
 * @param data 用于存储数据项的可变列表，默认为空列表。
 */
open class CommonAdapter<D>(val layout:(D)->Pair<Int,Int>, val data:MutableList<D> = mutableListOf()):Adapter<CommonViewHolder>(){
	/**
	 * 根据数据项的类型返回对应的视图类型。
	 *
	 * @param position 数据项的位置。
	 * @return 数据项的视图类型。
	 */
	override fun getItemViewType(position: Int): Int  = layout(data[position]).first
	/**
	 * 创建用于展示数据项的ViewHolder。
	 *
	 * @param parent 父视图组。
	 * @param viewType 数据项的视图类型。
	 * @return 创建的ViewHolder。
	 */
	override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CommonViewHolder  =
		CommonViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context),viewType,parent,false))
	/**
	 * 将数据项绑定到ViewHolder的视图上。
	 *
	 * @param holder ViewHolder对象。
	 * @param position 数据项的位置。
	 */
	override fun onBindViewHolder(holder: CommonViewHolder, position: Int) {
		holder.binding.setVariable(layout(data[position]).second,data[position])
	}
	/**
	 * 返回数据列表的大小。
	 *
	 * @return 数据列表的大小。
	 */
	override fun getItemCount(): Int  = data.size
	/**
	 * 向数据列表中添加数据项，并通知适配器数据已更改。
	 *
	 * @param list 要添加的数据项列表。
	 */
	operator fun plusAssign(list: List<D>){
		val size = data.size
		data+=list
		notifyItemRangeInserted(size,list.size)
	}
	/**
	 * 清空数据列表，并通知适配器数据已更改。
	 */
	fun clear(){
		val size = data.size
		data.clear()
		notifyItemRangeRemoved(0,size)
	}
	
	/**
	 * 点击事件的监听器接口。
	 */
	interface PlayOnclickListener{
		/**
		 * 当数据项被点击时调用。
		 *
		 * @param view 被点击的视图。
		 * @param entity 被点击的数据项。
		 */
		fun onClick(view: View, entity:MutilVideoEntity)
	}
	
	/**
	 * 保存点击事件的监听器实例。
	 */
	private lateinit var palyOnclickListener: PlayOnclickListener
	
	/**
	 * 设置点击事件的监听器。
	 *
	 * @param listener 点击事件的监听器。
	 */
	fun setPlayOnclickListener(listener:PlayOnclickListener){
		this.palyOnclickListener = listener
	}
}
/**
 * CommonAdapter使用的ViewHolder类，它持有一个 ViewDataBinding对象。
 *
 * @param binding 绑定数据和视图的对象。
 */
class CommonViewHolder(val binding:ViewDataBinding):ViewHolder(binding.root)